/**
 * @author : xwj
 * @date : 2021/7/6 23:49
 * @description : LeetCode 第四题
 * @class : four
 *
 * 给定两个大小分别为 m 和 n 的正序（从小到大）数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
 **/

public class test4 {

    /**
     * 方法一：先求出中位数的位置，在一次遍历两个数组，找到对应位置的数，得到中位数。
     * Leetcode结果: 2 ms	39.9 MB
     * **/
    public double findMedianSortedArrays1(int[] nums1, int[] nums2) {
        int p = 0,pre = 0,count=0;
        int len1 = nums1.length;
        int len2 = nums2.length;
        int len = len1+len2;
        //无数据
        if(len == 0){
            return 0;
        }else {
            int i = 0,j = 0;
            //奇数个数
            if (len%2 == 1){
                while (i < len1 && j < len2){
                    if (nums1[i] < nums2[j]){
                        if (count == len/2){
                            return nums1[i];
                        }
                        i++;
                        count++;
                    }else {
                        if (count == len/2){
                            return nums2[j];
                        }
                        j++;
                        count++;
                    }
                }
                if (i == len1){
                    while (j < len2){
                        if (count == len/2){
                            return nums2[j];
                        }
                        j++;
                        count++;
                    }
                }else {
                    while (i < len1){
                        if (count == len/2){
                            return nums1[i];
                        }
                        i++;
                        count++;
                    }
                }
            }
            //偶数个数
            else {
                while (i < len1 && j < len2){
                    if (nums1[i] < nums2[j]){
                        if (count == len/2-1){
                            pre = nums1[i];
                        }
                        if (count == len/2){
                            p = nums1[i];
                        }
                        i++;
                        count++;
                    }else {
                        if (count == len/2-1){
                            pre = nums2[j];
                        }
                        if (count == len/2){
                            p = nums2[j];
                        }
                        j++;
                        count++;
                    }
                }
                if (i == len1){
                    while (j < len2){
                        if (count == len/2-1){
                            pre = nums2[j];
                        }
                        if (count == len/2){
                            p = nums2[j];
                        }
                        j++;
                        count++;
                    }
                }else {
                    while (i < len1){
                        if (count == len/2-1){
                            pre = nums1[i];
                        }
                        if (count == len/2){
                            p = nums1[i];
                        }
                        i++;
                        count++;
                    }
                }
                return ((double) p + (double) pre)/2;
            }
        }
        return 0;
    }

    /**
     * 方法一优化
     * 2 ms	39.8 MB
     * **/
    public double findMedianSortedArrays2(int[] nums1, int[] nums2) {
        int i = 0,j = 0,count=0,p = 0, pre = 0;
        int len1 = nums1.length;
        int len2 = nums2.length;
        int len = len1+len2;
        //找到中位数时退出
        while (i + j < len/2+1){
            pre = p;
            if (i == len1){
                p = nums2[j];
                j++;
                continue;
            }
            if (j == len2 || nums1[i] < nums2[j]){
                p = nums1[i];
                i++;
            }else {
                p = nums2[j];
                j++;
            }
        }
        return (len % 2 == 1) ? (double) p:((double)p + (double)pre)/2;
    }

    public static void main(String[] args) {
        int[] nums1 = new int[]{123,54,66666665};
        int[] nums2 = new int[]{2};
        System.out.println(new test4().findMedianSortedArrays2(nums1,nums2));
    }

}
